#include <iostream>
#include <unistd.h>
#include <cstring>
#include <sys/types.h>
#include <sys/wait.h>
#include <vector>
#include <string>

void ChildProcess(int fd)
{
    std::cout << "子进程执行" << std::endl;
    // sleep(10);
    // 进行管道输入
    while (1)
    {
        std::cout << "请进行输入->";
        std::string temp;
        std::cin>>temp;
        write(fd, temp.c_str(), temp.size());
    }
}

void ParentProcess(int fd)
{
    std::cout << "父进程执行" << std::endl;
    char buffer[1024];
    int nread;
    while (1)
    {
        nread = read(fd, buffer, sizeof(buffer));

        if (nread == 0)
        {
            break;
        }
        buffer[nread] = '\0';
        std::cout << "子进程说：" << buffer << std::endl;
    }
}
int main()
{
    // 建立匿名管道用于拥有血缘关系进程之间的通信
    int pipefd[2];
    // 返回值是0表示创建成功，-1表示创建失败
    if (pipe(pipefd) == -1)
    {
        std::cout << "创建管道失败" << std::endl;
        return 0;
    }
    else if (pipe(pipefd) == 0)
    {
        std::cout << "创建管道成功" << std::endl;
    }
    else
    {
        std::cout << "未知错误" << std::endl;
    }
    // 创建子进程
    pid_t pid = fork();
    // pid等于0表示子进程，pid大于0表示父进程,等于-1表示创建失败
    if (pid == -1)
    {
        std::cout << "创建子进程失败" << std::endl;
        return 0;
    }
    else if (pid == 0)
    {
        // 子进程执行的代码
        // 先关闭读管道
        close(pipefd[0]);
        ChildProcess(pipefd[1]);
        close(pipefd[1]);
        // 子进程结束
        exit(0);
    }
    else
    {
        // 父进程执行的代码
        // 先关闭写管道
        close(pipefd[1]);
        ParentProcess(pipefd[0]);
        close(pipefd[0]);
        // 父进程结束
        wait(NULL);
    }
}